package com.hk.common.utils;

import cn.hutool.core.util.StrUtil;

import java.awt.*;

/**
 * @author 20231
 */
public class ColorUtil {

    /**
     * 计算两种颜色的欧几里得距离
     * @param color1 第一种颜色
     * @param color2 第二种颜色
     * @return 两种颜色的欧几里得距离
     */
    public static double calculateEuclideanDistance(Color color1, Color color2) {
        int red1 = color1.getRed();
        int green1 = color1.getGreen();
        int blue1 = color1.getBlue();

        int red2 = color2.getRed();
        int green2 = color2.getGreen();
        int blue2 = color2.getBlue();

        return Math.sqrt(Math.pow(red1 - red2, 2) + Math.pow(green1 - green2, 2) + Math.pow(blue1 - blue2, 2));
    }

    /**
     * 计算两种颜色的相似度
     * @param color1 第一种颜色
     * @param color2 第二种颜色
     * @return 两种颜色的相似度，范围从0（完全不相似）到1（完全相似）
     */
    public static double calculateSimilarity(Color color1, Color color2) {
        // 假设最大距离为sqrt(255^2 + 255^2 + 255^2) = 441.67
        double maxDistance = Math.sqrt(3 * Math.pow(255, 2));
        double distance = calculateEuclideanDistance(color1, color2);
        return 1 - (distance / maxDistance);
    }

    /**
     * 将 "0xXXXXXX" 格式的颜色字符串转换为 "#XXX" 格式
     * @param colorStr "0xXXXXXX" 格式的颜色字符串
     * @return "#XXX" 格式的颜色字符串
     */
    public static String convertColor(String colorStr) {
        if (StrUtil.isBlank(colorStr)) return null;
        // 将颜色字符串转换为整数
        int color = Integer.parseInt(colorStr.substring(2), 16);
        // 将颜色值转换为十六进制字符串
        String hexColor = Integer.toHexString(color);
        // 补齐前导零
        while (hexColor.length() < 6) {
            hexColor = "0" + hexColor;
        }
        // 添加 # 符号
        return "#" + hexColor.toUpperCase();
    }

    public static void main(String[] args) {
//        Color color1 = new Color(0xFF5733);
//        Color color2 = new Color(0xFFC300);
        Color color1 = Color.decode("0xFF5733");
        Color color2 = Color.decode("#FFC300");


        double similarity = calculateSimilarity(color1, color2);
        System.out.println("颜色相似度: " + similarity);
        System.out.println(convertColor("0x206080"));
    }
}
